<?php

/*
class WidgetContext
{

	public function __construct ($parent=NULL)
	{
		$this->parent = $parent;
	} // end of __construct
	public function setParam ($name, $value)
	{
		$this->$name = $value;
	} // end of function set
	public function getParam ($name, $default)
	{
		if (property_exists($this, $key)) return $this->$key;
		elseif (isset($this->parent))     return $parent->get($name, $default);
		else                              return $default;
	} // end of function get

}
 */

abstract class MainPageWidget
{

	var $template_var_name;
	var $acl_assistant; // ссылка на ассистента
	var $store; // ссылка на store
	var $ctx; // ссылка на ctx

	// обязательные параметры конфигурации виджета,
	// устанавливаемые из вне
	var $widget_id       = NULL;  // id виджета
	var $widget_url      = NULL;  // базовый url на который маппятся экшены виджета
	var $widget_view     = NULL;  // имя вьюхи для своей морды
	var $widget_position = NULL;  // позиция во внешней вьюхе для отрисовки

	var $ui_configurable = true; // если false то виджет не конфигурируется через интерфейс юзера
	var $ui_settingsjs   = "widget/settings_buttons.js"; // js для формы конфигурации виджета
	var $ui_frontjs      = NULL; // js для морды виджета

	public function __construct($parent=NULL)
	{
		if (isset($parent)) {
			$this->parent        = $parent;
			$this->acl_assistant = $parent->module->aa;
			$this->ctx           = $parent->ctx;
			$this->store         = $parent->ctx->store;
		}
	}

	/**
	 * initWidget вызывается средой после создания виджета.
	 *
	 * @param mixed $parent
	 * @return void
	 */
	public function initWidget ($parent)
	{
	} // end of method initWidget

	/**
	 * process вызывается средой когда для виджета поступила команда.
	 *
	 * @return void
	 */
	public function process ($rh)
	{
		$this->response = $rh->response;

		$request = isset($rh->GET['action']) ? 'handle_'.$rh->GET['action'] : 'handle';
		$m       = array($this, $request);
		if (is_callable($m)) {
			return call_user_func_array($m, array($rh));
		}
	} // end of function process

	/**
	 * renderWidget	вызывается средой для отрисовки виджета.
	 *
	 * @param mixed $global_view
	 * @return void
	 */
	public function renderWidget ($global_view)
	{
		if ($this->render() !== false) {
			$position               = $this->getParam('widget_position');
			$v = $this->getView();
			if (isset($global_view->data[$position])) {
				$global_view->append($position, $v->getContent());
			} else {
				$global_view->set($position, $v->getContent(), $v->content_type);
			}
		}
	}


	public function render()
	{
	}

	public function settingsForm ()
	{
	} // end of method settingsForm

	public function beforeUpdateSettings (&$config)
	{
	} // end of method beforeUpdateSettings

	// --- ITdis --- {{{
	var $tdis;
	protected function buildChecklistItemFromTdi ($tdi)
	{
		$ci = $tdi->data;
		$ci['type'] = 'checkbox';
		$ci['default'] = $tdi->id;
		$ci['checked'] = in_array($tdi->id, $this->tdis);
		return $ci;
	} // end of method buildChecklistItemFromTdi
	public function getTdis ($where_tdis=NULL)
	{
		$tdis = array();

		$community_oid = $this->getParam('community_oid', $this->acl_assistant->acl_data['comity_oid']);
		if (is_array($where_tdis) && $where_tdis) {
			$ql = "select objects where tdi.community_oid = :0 and tdi.oid in :1 and is_deleted = 0";
			$results = $this->store->find( $ql, array($community_oid, $where_tdis) );
		} else {
			$ql = "select objects where tdi.community_oid = :0 and is_deleted = 0";
			$results = $this->store->find( $ql, array($community_oid));
		}
		while ($tdi = $results->next()) {
			$tdis[] = $this->buildChecklistItemFromTdi ($tdi);
		}

		if (!$where_tdis || (is_array($where_tdis) && in_array(0, $where_tdis))) {
			$fake_section = $this->store->create("ftdi", array("title"=>"Без раздела"));
			$fake_section->id = 0;
			$tdis[] = $this->buildChecklistItemFromTdi($fake_section);
		}

		return $tdis;
	} // end of method getTdis
	// --- ITdis --- }}}

	public function getWidgetsByName ($name)
	{
		$res = array();
		foreach ($this->parent->widgets as $widget) {
			if ($widget->widget_name === $name) {
				$res[] = $widget;
			}
		}
		return $res;
	} // end of method findParentWidgetByName


	public function getView ($name=NULL)
	{
		$view_name  = isset($name) ? $name : $this->getParam('widget_view', $name);
		$view       = $this->ctx->rh->views->findByName($view_name);
		$view->data = $this->acl_assistant->template_data;
		$view->data['widget'] = $this;
		return $view;
	} // end of function getView

	// --- IWidgetConfig --- {{{
	//!a manipulator
	public function setParam ($key, $value)
	/**
	 * Установить параметр конфигурации.
	 *
	 * @param mixed $key имя параметра
	 * @param mixed $value значение
	 * @access public
	 * @return $this
	 */
	{
		$this->$key = $value;
		return $this;
	} // end of function setParam
	public function setParamIfEmpty ($key, $value)
	/**
	 * Установить параметр конфигурации, если не задан.
	 *
	 * @param mixed $key имя параметра
	 * @param mixed $value значение
	 * @access public
	 * @return $this
	 */
	{
		if (property_exists($this, $key) && !empty($this->$key)) {
		} else {
			$this->$key = $value;
		}
		return $this;
	} // end of function setParam
	//!an accessor
	public function getParam ($key, $default=NULL)
 	/**
	 * Вернуть параметр конфигурации, если есть, иначе -- значение по умолчанию.
	 *
	 * @param mixed $key имя параметра конфигурации.
	 * @param mixed $default значение по умолчанию, которое возвращается, если параметр не установлен.
	 * @access public
	 * @return mixed
	 */
	{
		if (property_exists($this, $key)) return $this->$key;
		return $default;
	} // end of function getParam
	public function getTextParam ($key, $default=NULL)
 	/**
	 * Вернуть текстовый параметр конфигурации, если есть, иначе -- значение по умолчанию.
	 *
	 * @param mixed $key имя параметра конфигурации.
	 * @param mixed $default значение по умолчанию, которое возвращается, если параметр не установлен.
	 * @access public
	 * @return mixed
	 */
	{
		if (property_exists($this, $key) && is_string($this->$key) && !empty($this->$key)) return $this->$key;
		return $default;
	} // end of function getParam
	// --- IWidgetConfig --- }}}

	public function getTdiList( $community_oid ) {
    $tdis = array();

    $sql = "select t.oid, t.title, t.community_oid " .
    " from {$this->ctx->store->db->db_prefix}class_tdi t " .
    " left join {$this->ctx->store->db->db_prefix}objects o on o.oid = t.oid " .
    " left join {$this->ctx->store->db->db_prefix}class_tdi_order `to` on `to`.oid = t.oid " .
    " where o.is_deleted = 0 and t.community_oid = {$community_oid} " .
    " order by `to`.`order`, t.oid";

    $result = $this->ctx->store->query($sql);
    while ( $rec = $result->next() ) {
      $tdis[] = $rec;
    }

    return $tdis;
  }
}


?>
